package main.chapter5.objectAnalyzer;/**
 * @Author xy
 * @Date 2020/6/18 20:31
 * @Description
 */

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

/**
 * 文件名称： main.chapter5.objectAnalyzer.ObjectAnalyzer.java</br>
 * 初始作者： xy</br>
 * 创建日期： 2020/6/18 20:31</br>
 * 功能说明： TODO <br/>
 * =================================================<br/>
 * 修改记录：<br/>
 * 修改作者        日期       修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2020-2021 .All rights reserved.<br/>
 */
public class ObjectAnalyzer {
    private ArrayList<Object> visited = new ArrayList<>();

    public String toString(Object obj) throws IllegalAccessException {
        if(obj==null) {
            return "null";
        }

        if(visited.contains(obj)){
            return "...";
        }
        visited.add(obj);
        Class cl = obj.getClass();
        if(cl==String.class){
            return (String)obj;
        }
        if(cl.isArray()){
            String r = cl.getComponentType()+"[]{";
            for(int i=0;i< Array.getLength(obj);i++){
                if(i>0){
                    r+=",";
                    Object val = Array.get(obj,i);
                    if(cl.getComponentType().isPrimitive()){
                        r+=val;
                    }else {
                        r+=toString(val);
                    }
                }
            }
            return r+="}";
        }

        String r = cl.getName();
        do {
            r+="[";
            Field[] fields = cl.getDeclaredFields();
            AccessibleObject.setAccessible(fields,true);
            for(Field field : fields){
                if(!Modifier.isStatic(field.getModifiers())){
                    if(!r.endsWith("[")){
                        r+=",";
                    }
                    r+=field.getName()+"=";
                    Class t = field.getType();
                    Object val = field.get(obj);
                    if(t.isPrimitive()){
                        r+=val;
                    }else {
                        r+=toString(val);
                    }
                }
            }
            r+="]";
            cl=cl.getSuperclass();
        }while (cl!=null);
        return r;
    }
}
